%{

  open Glob 

%}

%token ADD SUB MUL QUO REM ADDI
%token LW SW AND ANDI OR ORI
%token XOR NOR SLL SLR SAR BEQ
%token JAL JR J
%token EOF
%token <int> ENTIER
%token <int> LABEL

%start program
%type <unit> program

%%

program :
  | list(instr) EOF {}

instr:
  |ADD  r=ENTIER s=ENTIER t=ENTIER { incr nbInstr; liste := (!liste)@(List.rev (((itl 0  6)@(itl r 5)@(itl s 5)@(itl t 5)@(itl 0 11))))@[2] }
  |SUB  r=ENTIER s=ENTIER t=ENTIER { incr nbInstr; liste := (!liste)@(List.rev (((itl 8  6)@(itl r 5)@(itl s 5)@(itl t 5)@(itl 0 11))))@[2] }
  |ADDI r=ENTIER s=ENTIER c=ENTIER { incr nbInstr; liste := (!liste)@(List.rev (((itl 16 6)@(itl r 5)@(itl s 5)@(itl c 16)          )))@[2] }
  |LW   r=ENTIER s=ENTIER c=ENTIER { incr nbInstr; liste := (!liste)@(List.rev (((itl 32 6)@(itl r 5)@(itl s 5)@(itl c 16)          )))@[2] }
  |SW   r=ENTIER s=ENTIER c=ENTIER { incr nbInstr; liste := (!liste)@(List.rev (((itl 48 6)@(itl r 5)@(itl s 5)@(itl c 16)          )))@[2] }
  |MUL  r=ENTIER s=ENTIER t=ENTIER { incr nbInstr; liste := (!liste)@(List.rev (((itl 4  6)@(itl r 5)@(itl s 5)@(itl t 5)@(itl 0 11))))@[2] }
  |QUO  r=ENTIER s=ENTIER t=ENTIER { incr nbInstr; liste := (!liste)@(List.rev (((itl 12 6)@(itl r 5)@(itl s 5)@(itl t 5)@(itl 0 11))))@[2] }
  |REM  r=ENTIER s=ENTIER t=ENTIER { incr nbInstr; liste := (!liste)@(List.rev (((itl 2  6)@(itl r 5)@(itl s 5)@(itl t 5)@(itl 0 11))))@[2] }
  |AND  r=ENTIER s=ENTIER t=ENTIER { incr nbInstr; liste := (!liste)@(List.rev (((itl 10 6)@(itl r 5)@(itl s 5)@(itl t 5)@(itl 0 11))))@[2] }
  |ANDI r=ENTIER s=ENTIER c=ENTIER { incr nbInstr; liste := (!liste)@(List.rev (((itl 26 6)@(itl r 5)@(itl s 5)@(itl c 16)          )))@[2] }
  |OR   r=ENTIER s=ENTIER t=ENTIER { incr nbInstr; liste := (!liste)@(List.rev (((itl 6  6)@(itl r 5)@(itl s 5)@(itl t 5)@(itl 0 11))))@[2] }
  |ORI  r=ENTIER s=ENTIER c=ENTIER { incr nbInstr; liste := (!liste)@(List.rev (((itl 22 6)@(itl r 5)@(itl s 5)@(itl c 16)          )))@[2] }
  |XOR  r=ENTIER s=ENTIER t=ENTIER { incr nbInstr; liste := (!liste)@(List.rev (((itl 14 6)@(itl r 5)@(itl s 5)@(itl t 5)@(itl 0 11))))@[2] }
  |NOR  r=ENTIER s=ENTIER t=ENTIER { incr nbInstr; liste := (!liste)@(List.rev (((itl 1  6)@(itl r 5)@(itl s 5)@(itl t 5)@(itl 0 11))))@[2] }
  |SLL  r=ENTIER s=ENTIER c=ENTIER { incr nbInstr; liste := (!liste)@(List.rev (((itl 25 6)@(itl r 5)@(itl s 5)@(itl c 16)          )))@[2] }
  |SLR  r=ENTIER s=ENTIER c=ENTIER { incr nbInstr; liste := (!liste)@(List.rev (((itl 21 6)@(itl r 5)@(itl s 5)@(itl c 16)          )))@[2] }
  |SAR  r=ENTIER s=ENTIER c=ENTIER { incr nbInstr; liste := (!liste)@(List.rev (((itl 29 6)@(itl r 5)@(itl s 5)@(itl c 16)          )))@[2] }
  |BEQ  r=ENTIER s=ENTIER c=ENTIER { incr nbInstr; liste := (!liste)@(List.rev (((itl 62 6)@(itl r 5)@(itl s 5)@(itl c 16)          )))@[2] }
  |BEQ  r=ENTIER s=ENTIER id=LABEL { incr nbInstr; liste := (!liste)@(List.rev (((itl 62 6)@(itl r 5)@(itl s 5)@[16;!nbInstr;id]    )))@[2] }
  |JAL  c=ENTIER                   { incr nbInstr; liste := (!liste)@(List.rev (((itl 3  6)@(itl c 26)                              )))@[2] }
  |JR   r=ENTIER                   { incr nbInstr; liste := (!liste)@(List.rev (((itl 56 6)@(itl r 5)@(itl 0 21)                    )))@[2] }
  |J    c=ENTIER                   { incr nbInstr; liste := (!liste)@(List.rev (((itl 59 6)@(itl c 26)                              )))@[2] }
  |J    id=LABEL                   { incr nbInstr; liste := (!liste)@(List.rev (((itl 59 6)@[26;!nbInstr;id]                        )))@[2] }
%%
